/* Environment.h
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 01/04/2015
 *  Last Modified   : 01/01/2016
 * 
 */

#pragma once
#ifndef ymp_Environment_H
#define ymp_Environment_H
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Dependencies
#include <vector>
#include <string>
#include "PublicLibs/Types.h"
namespace ymp{
namespace Environment{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Call one of these on startup.
void initialize_environment(int argc, char* argv[]);
void initialize_environment(int argc, wchar_t* argv[]);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Run-Time
const std::vector<std::string>& get_cmd_parameters();
const std::string& get_process_path();
const std::string& get_process_directory();
bool RunFromConsole();
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
const upL_t MAX_MEMORY = (((upL_t)0 - 1) / 16) * 7;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
upL_t       get_logical_processors      ();
upL_t       get_free_physical_memory    ();
uiL_t       get_total_physical_memory   ();
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
inline upL_t suggest_use_all_memory(){
    //  Anything that wants to use all available memory should call this.
    //  15/16 should leave behind a reasonable amount for the OS.
    return get_free_physical_memory() / 16 * 15;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  x86 Specific
void x86_cpuid(u32_t eabcdx[4], u32_t eax, u32_t ecx = 0);
u64_t cpu_timestamp();
u64_t measure_cpu_timestamp_frequency();
inline u64_t cpu_timestamp_frequency(){
    static uiL_t cached = measure_cpu_timestamp_frequency();
    return cached;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
}
#endif
